使用矢量图形节点
Dora SSR 基于 nanovg 库,提供了一套强大的矢量图形绘制功能。本教程将引导您在 Dora SSR 中使用这些矢量图形功能。您将学习如何创建矢量图形节点、渲染形状、应用变换,以及加载和显示 SVG 文件。
1. 简介
矢量图形允许使用数学方程而非像素网格来创建可缩放、与分辨率无关的图像。Dora SSR 的矢量图形功能基于 nanovg
库,提供了基 础的类似于 HTML5 Canvas 的矢量绘图 API。并且可以和 Dora SSR 的场景节点系统进行集成使用。
在本教程中,我们将探索如何使用 Dora SSR 的矢量图形 API 来:
- 创建矢量图形节点(
VGNode
) - 直接在屏幕上绘制矢量图形
- 渲染形状和路径
- 应用变换
- 加载和显示 SVG 文件
2. 使用 VGNode
VGNode
是 Dora SSR 中用于将矢量图形静态渲染到一张纹理上,并挂载到游戏场景中展示的节点。所以它的内部包含了一张用于绘制矢量图形的帧缓冲纹理,并且本身是一个场景节点对象。要创建一个 VGNode
,您需要指定其尺寸,以及可选的缩放比例和边缘抗锯齿系数。
2.1 创建节点对象
- Lua
- Teal
- TypeScript
- YueScript
local VGNode <const> = require("VGNode")
-- 创建一个宽800,高600,默认缩放比例和边缘抗锯齿的 VGNode
local node = VGNode(
800, -- 帧缓冲纹理的宽度
600, -- 帧缓冲纹理的高度
1.0, -- 可选渲染单位的缩放比例。默认值为 `1.0`
1 -- 可选的边缘抗锯齿系数。默认值为 `1`
)
local VGNode <const> = require("VGNode")
local node = VGNode(
800, -- 帧缓冲纹理的宽度
600, -- 帧缓冲纹理的高度
1.0, -- 可选渲染单位的缩放比例。默认值为 `1.0`
1 -- 可选的边缘抗锯齿系数。默认值为 `1`
)
import { VGNode } from "Dora";
const node = VGNode(
800, // 帧缓冲纹理的宽度
600, // 帧缓冲纹理的高度
1.0, // 可选渲染单位的缩放比例。默认值为 `1.0`
1 // 可选的边缘抗锯齿系数。默认值为 `1`
);
_ENV = Dora
node = VGNode(
800 -- 帧缓冲纹理的宽度
600 -- 帧缓冲纹理的高度
1.0 -- 可选渲染单位的缩放比例。默认值为 `1.0`
1 -- 可选的边缘抗锯齿系数。默认值为 `1`
)
这将创建一个 VGNode
实例,我们将使用它把矢量图形渲染到自带的帧缓冲纹理上。
2.2 渲染矢量图形
要渲染矢量图形,使用 VGNode
实例的 render
方法。您需要传递一个包含使用 nvg
模块的绘图命令 的函数(闭包)。这些绘图命令会将图形绘制到 VGNode
的帧缓冲纹理上。
nvg
模块提供了绘制矩形、圆形、线条和路径等基本形状的函数。您还可以使用颜色和画笔来自定义形状的外观。
示例:绘制矩形
- Lua
- Teal
- TypeScript
- YueScript
local VGNode <const> = require("VGNode")
local nvg <const> = require("nvg")
local Color <const> = require("Color")
local node = VGNode(200, 150)
node:render(function()
nvg.BeginPath() -- 开始新路径
nvg.Rect(0, 0, 200, 150) -- x, y, 宽度, 高度
nvg.FillColor(Color(255, 0, 0, 255)) -- 红色
nvg.Fill()
end)
local VGNode <const> = require("VGNode")
local nvg <const> = require("nvg")
local Color <const> = require("Color")
local node = VGNode(200, 150)
node:render(function()
nvg.BeginPath() -- 开始新路径
nvg.Rect(0, 0, 200, 150) -- x, y, 宽度, 高度
nvg.FillColor(Color(255, 0, 0, 255)) -- 红色
nvg.Fill()
end)
import { VGNode, Color } from "Dora";
import * as nvg from "nvg";
const node = VGNode(200, 150);
node.render(() => {
nvg.BeginPath(); // 开始新路径
nvg.Rect(0, 0, 200, 150); // x, y, 宽度, 高度
nvg.FillColor(Color(255, 0, 0, 255)); // 红色
nvg.Fill();
});